package org.jsola.hr.dao;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.jsola.hr.entity.EmpSocMonthDO;
import org.jsola.hr.vo.EmpSocMonthListVO;
import org.jsola.hr.vo.EmpSocMonthVO;
import org.jsola.hr.vo.YearAndMonthVO;
import org.jsola.orm.mapper.IJsolaMapper;
import org.springframework.stereotype.Repository;

import java.util.List;


/**
 * 员工参保信息月统计
 *
 * @author zhr
 */
@Repository("hrEmpSocMonthDAO")
public interface IEmpSocMonthDAO extends IJsolaMapper<EmpSocMonthDO> {


    /**
     * 获取某公司已创建参保的年月
     *
     * @param companyId 公司id
     * @param siteId    站点id
     * @return 某公司已创建参保的年月
     */
    @Select("select distinct year, month from hr_emp_soc_month where is_valid = 1 and company_id = #{companyId} and `site_id` = #{siteId} ")
    List<YearAndMonthVO> listYearAndMonthByCompany(@Param(value = "companyId") String companyId, @Param(value = "siteId") String siteId);

    /**
     * 查询某个时间或某个时间段的MonthId
     *
     * @param startYear    开始年
     * @param startMonth   开始月
     * @param endYear      结束年
     * @param endMonth     结束月
     * @param companyId    公司Id
     * @param isAcrossYear 是否跨年
     * @param siteId       站点
     * @return 参保月列表
     */
    List<EmpSocMonthVO> selectMonthIdForWhile(@Param(value = "startYear") String startYear,
                                              @Param(value = "startMonth") String startMonth,
                                              @Param(value = "endYear") String endYear,
                                              @Param(value = "endMonth") String endMonth,
                                              @Param(value = "companyId") String companyId,
                                              @Param(value = "isAcrossYear") Boolean isAcrossYear,
                                              @Param(value = "siteId") String siteId);


    /**
     * 查询某年所有参保月
     *
     * @param year      某年
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 参保月列表
     */
    List<EmpSocMonthVO> selectOneYearMonthId(@Param(value = "year") String year,
                                             @Param(value = "companyId") String companyId,
                                             @Param(value = "siteId") String siteId);

    /**
     * 查询传入月之间MonthId
     *
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @param companyId 公司id
     * @param siteId    站点
     * @return 参保月列表
     */
    List<String> selectCurrentDateBetweenMonthId(@Param(value = "startDate") String startDate,
                                                 @Param(value = "endDate") String endDate,
                                                 @Param(value = "companyId") String companyId,
                                                 @Param(value = "siteId") String siteId);

    /**
     * 查询大于传入月的参保月
     *
     * @param date      时间
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 参保月列表
     */
    List<EmpSocMonthDO> selectMonthIdListAfterDate(@Param(value = "date") String date,
                                                   @Param(value = "companyId") String companyId,
                                                   @Param(value = "siteId") String siteId);

    /**
     * 查询大于等于传入月的monthId
     *
     * @param date      时间
     * @param companyId 公司Id
     * @param siteId    站点
     * @return id列表
     */
    List<String> selectMonthIdListAfterAndEqualsDate(@Param(value = "date") String date,
                                                     @Param(value = "companyId") String companyId,
                                                     @Param(value = "siteId") String siteId);


    /**
     * 查询用工单位下创建的最后一个参保月
     *
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 参保月
     */
    EmpSocMonthDO selectMaxDate(@Param(value = "companyId") String companyId,
                                @Param(value = "siteId") String siteId);

    /**
     * 根据时间字符串列表查询参保月
     *
     * @param companyId   公司Id
     * @param dateStrList 时间字符串
     * @param siteId      站点
     * @return 参保月列表
     */
    List<EmpSocMonthListVO> selectByMonthByDateStrList(@Param(value = "companyId") String companyId,
                                                       @Param(value = "dateStrList") List<String> dateStrList,
                                                       @Param(value = "siteId") String siteId);
}

